package com.sojson.util.encrypt.bothway.alike.jasypt;

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

/**
 * Jasypt双向加解密工具类
 *
 * @author liu
 * @date 2022-02-11
 */
public class JasyptUtil {

    /** 配置是否加密 */
    public static final boolean isEn = getKey() != null;
    public static final PooledPBEStringEncryptor ENCRYPTOR = new PooledPBEStringEncryptor();

    static {
        ENCRYPTOR.setConfig(getConfig());
    }

    /**
     * 加密
     *
     * @param data
     * @return
     */
    public static String encrypt(String data) {
        return encrypt(data, getKey());
    }

    /**
     * 加密
     *
     * @param data
     * @return
     */
    public static byte[] encrypt(byte[] data) {
        return encryptToStr(data).getBytes();
    }

    /**
     * 加密
     *
     * @param data
     * @return
     */
    public static byte[] encryptToByte(String data) {
        return encrypt(data).getBytes();
    }

    /**
     * 加密
     *
     * @param data
     * @return
     */
    public static String encryptToStr(byte[] data) {
        return encrypt(new String(data));
    }

    /**
     * 加密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String encrypt(String data, String key) {
        return ENCRYPTOR.encrypt(data);
    }

    /**
     * 加密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] encrypt(byte[] data, String key) {
        return encryptToStr(data, key).getBytes();
    }

    /**
     * 加密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] encryptToByte(String data, String key) {
        return encrypt(data, key).getBytes();
    }

    /**
     * 加密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String encryptToStr(byte[] data, String key) {
        return encrypt(new String(data), key);
    }

    /**
     * 解密
     *
     * @param data
     * @return
     */
    public static String decrypt(String data) {
        return decrypt(data, getKey());
    }

    /**
     * 解密
     *
     * @param data
     * @return
     */
    public static byte[] decrypt(byte[] data) {
        return decryptToStr(data).getBytes();
    }

    /**
     * 解密
     *
     * @param data
     * @return
     */
    public static byte[] decryptToByte(String data) {
        return decrypt(data).getBytes();
    }

    /**
     * 解密
     *
     * @param data
     * @return
     */
    public static String decryptToStr(byte[] data) {
        return decrypt(new String(data));
    }

    /**
     * 解密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String decrypt(String data, String key) {
        return ENCRYPTOR.decrypt(data);
    }

    /**
     * 解密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] decrypt(byte[] data, String key) {
        return decryptToStr(data, key).getBytes();
    }

    /**
     * 解密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] decryptToByte(String data, String key) {
        return decrypt(data, key).getBytes();
    }

    /**
     * 解密
     *
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String decryptToStr(byte[] data, String key) {
        return decrypt(new String(data), key);
    }

    /**
     * 获取Jasypt配置密钥
     *
     * @return
     */
    public static String getKey() {
        return System.getProperty("jasypt.encryptor.password");
    }

    /**
     * 获取Jasypt配置类
     *
     * @return
     */
    public static SimpleStringPBEConfig getConfig() {
        return getConfig(getKey());
    }

    /**
     * 获取Jasypt配置类
     *
     * @param key   密钥
     * @return
     */
    public static SimpleStringPBEConfig getConfig(String key) {
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(key);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations(1000);
        config.setPoolSize(1);
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        return config;
    }

}